"""
与开始游戏界面相关的模块
"""
import pygame.transform
from src import image, text, window, process
from src.event import mouse

# “开始游戏”按钮在 y 轴上的位置
START_BTN_Y = 500
# 加载动画执行时长，单位帧，即执行完动画需要几帧
LOADING_DURATION = 100
# 加载动画已经执行时长
loading_time = 0
# 加载动画是否完成
is_loaded = False
# “开始游戏”按钮背景图片
start_btn_bar_img = None
# “开始游戏”按钮文本对象
start_btn_text = None


def start_game_page():
    """
    开始游戏界面
    :return:
    """
    global start_btn_bar_img
    global start_btn_text
    # 绘制“开始游戏”界面的背景图片
    image.draw_img(image.start_bg)
    # 绘制“植物大战僵尸” Logo 图片
    image.draw_img(image.start_logo, is_h_center=True, is_transparent=True)
    # 创建“开始游戏”按钮背景图片
    if start_btn_bar_img is None:
        start_btn_bar_img = image.Image(
            img=image.start_btn_bar_dirt,
            img_active=image.start_btn_bar_dirt,
            position=(0, START_BTN_Y),
            is_h_center=True,
            is_transparent=True
        )
        # 添加点击事件监听
        start_btn_bar_img.add_mousedown_listen(start_btn_mousedown_handler)
        # 添加鼠标悬浮事件监听
        start_btn_bar_img.add_mousemotion_listen(start_btn_mousemotion_handler)
    # 绘制“开始游戏”按钮背景图片
    start_btn_bar_img.draw()
    # 创建“开始游戏”按钮文本对象
    if start_btn_text is None:
        start_btn_text = text.Text(
            color='#D9B721',
            color_active='#FF5500',
            bold=True,
            position=(0, START_BTN_Y + image.start_btn_bar_dirt.get_height() / 2 - 12),
            is_h_center=True,
        )
    # 草地加载动画
    loading()


def start_btn_mousemotion_handler(is_mousemotion, key, event):
    """
    “开始游戏”按钮鼠标悬浮事件处理函数
    :param is_mousemotion: 鼠标是悬浮在当前对象上
    :param key: 当前需要监听鼠标悬浮事件的字典集合中匹配的 key
    :param event: 事件对象
    :return:
    """
    global start_btn_text
    if is_mousemotion:
        mouse.hand_mouse()
        start_btn_text.set_is_active(True)
    else:
        mouse.arrow_mouse()
        start_btn_text.set_is_active(False)


def start_btn_mousedown_handler(key, event):
    """
    “开始游戏”按钮点击事件处理函数
    :key: 当前需要监听点击事件的字典集合中匹配的 key
    :param event: 事件对象
    :return:
    """
    # 如果加载还未完成，直接退出当前函数的执行
    if not is_loaded:
        return
    # 恢复鼠标样式
    mouse.arrow_mouse()
    # 游戏进程状态更新为主菜单界面
    process.process = process.MAIN_MENU
    # 从需要监听点击事件的字典集合中移除
    mouse.obj_dict_listen_mousedown.pop(key, None)
    # 从需要监听鼠标悬浮事件的字典集合中移除
    mouse.obj_dict_listen_mousemotion.pop(key, None)


def loading():
    """
    草地加载动画
    :return:
    """
    global loading_time
    global is_loaded
    global start_btn_text
    # “开始游戏”按钮草地图片在 x 轴上的位置
    start_btn_grass_x = window.win.get_width() / 2 - image.start_btn_bar_dirt.get_width() / 2 - 5
    # 如果加载动画执行完成，直接绘制完整的草地图片
    if is_loaded:
        # 绘制“开始游戏”按钮文本
        start_btn_text.set_content('开始游戏')
        start_btn_text.draw()
        image.draw_img(
            image.start_btn_bar_grass,
            (start_btn_grass_x, START_BTN_Y - image.start_btn_bar_grass.get_height() / 2)
        )
        return
    # 绘制“载入中”按钮文本
    start_btn_text.set_content('载入中...')
    start_btn_text.draw()
    # 每帧绘制草地的宽度
    width_per_second = image.start_btn_bar_grass.get_width() / LOADING_DURATION
    # 绘制草地图片
    image.draw_img(
        image.start_btn_bar_grass,
        (start_btn_grass_x, START_BTN_Y - image.start_btn_bar_grass.get_height() / 2),
        (loading_time * width_per_second, image.start_btn_bar_grass.get_height()),
    )
    # 草地卷图片的宽高
    start_btn_bar_grass_roll_w = image.start_btn_bar_grass_roll.get_width() * 0.9
    start_btn_bar_grass_roll_h = image.start_btn_bar_grass_roll.get_height() * 0.9
    # 每毫秒草地卷缩小的程度
    scale_x_per_second = start_btn_bar_grass_roll_w / 2 / LOADING_DURATION
    scale_y_per_second = start_btn_bar_grass_roll_h / 2 / LOADING_DURATION
    # 缩小草地卷
    start_btn_bar_grass_roll_w_now = start_btn_bar_grass_roll_w - scale_x_per_second * loading_time
    start_btn_bar_grass_roll_h_now = start_btn_bar_grass_roll_h - scale_y_per_second * loading_time
    start_btn_bar_grass_roll = pygame.transform.scale(
        image.start_btn_bar_grass_roll,
        (start_btn_bar_grass_roll_w_now, start_btn_bar_grass_roll_h_now)
    )
    # 旋转草地卷
    start_btn_bar_grass_roll = pygame.transform.rotate(start_btn_bar_grass_roll, loading_time * -1)
    # 绘制缩小后的草地卷
    image.draw_img(
        start_btn_bar_grass_roll,
        (
            start_btn_grass_x + loading_time * width_per_second - start_btn_bar_grass_roll_w_now / 2,
            START_BTN_Y - start_btn_bar_grass_roll_h_now + 8
        ),
        (start_btn_bar_grass_roll_w_now + 8, start_btn_bar_grass_roll_h_now + 8)
    )
    # 加载动画已经执行时长增加
    loading_time += 1
    # 加载动画执行完成
    if loading_time == LOADING_DURATION:
        is_loaded = True
